package echecs;

import position.Position;
import position.PositionFabrique;
import position.PositionFabrique.PositionType;
import echecs.Pieces.Piece;
import java.util.ArrayList;
import java.util.List;
import static echecs.Pieces.Piece.*;

public class CoupsLegaux extends PredicatBase {

    private List<Coups> pListeCoupsLegaux;
    private boolean pTraitAuxBlancs = true;

    public CoupsLegaux() {
        Position position = PositionFabrique.creerPosition(PositionType.INITIALE);
        position.placerPieces();

        ActionEchecs algo = new Algorithme(trait(), position.getPieces());
        pListeCoups = algo.listeDesCoups();
        pListeCoupsLegaux = examineEchecs(algo);


        System.out.print(toString());
    }

    private int index_roi(ActionEchecs algo) {
        int index = 0;
        if (ActionEchecs._couleur == Couleur.BLANC) {
//            pCouleurQuiNeJouePas = Couleur.NOIR;
            while (ActionEchecs.PIECES[index] != ROI_BLANC) {
                index++;
            }
        } else {
//            pCouleurQuiNeJouePas = Couleur.BLANC;
            index = 0;
            while (ActionEchecs.PIECES[index] != ROI_NOIR) {
                index++;
            }
        }//        System.out.print("(ROI en " + Case.valeur(index) + ")");
        return index;
    }

    private Couleur non_trait() {
        return trait() == Couleur.BLANC ? Couleur.NOIR : Couleur.BLANC;
    }

    private Couleur trait() {
        return pTraitAuxBlancs == true ? Couleur.BLANC : Couleur.NOIR;
    }

//    private boolean autorise_roques() {
//    }
    private List<Coups> examineEchecs(ActionEchecs algo) {
        //private void roque_possible
        //private void enEchecs
        int index_roi = index_roi(algo);
        Piece[] copyPIECES;
        List<Coups> listeCoupsAdverses;
        Couleur pCouleurQuiNeJouePas = non_trait();

        for (Coups coups : pListeCoups) {
            copyPIECES = new Piece[NB_COLONNES * NB_RANGEES];
            System.arraycopy(ActionEchecs.PIECES, 0, copyPIECES, 0, NB_COLONNES * NB_RANGEES);
            copyPIECES = simulerUnCoups(coups.pIndexDepart, coups.pIndexArrivee, copyPIECES);

            listeCoupsAdverses = new Algorithme(pCouleurQuiNeJouePas, copyPIECES).listeDesCoups();

            for (Coups cps : listeCoupsAdverses) {

                if (cps.pIndexArrivee == index_roi) {
                    pListeCoups.remove(coups);
                }
                System.out.print(cps.pPieceDepart.toString() + "(" + Case.valeur(cps.pIndexDepart) + ") :" +
                        Case.valeur(cps.pIndexArrivee) + '\n');

            }
            System.out.println();

        }
        return pListeCoups;
    }

    private Piece[] simulerUnCoups(int pIndexDepart, int pIndexArrivee, Piece[] pCopyPIECES) {
        pCopyPIECES[pIndexArrivee] = pCopyPIECES[pIndexDepart];
        pCopyPIECES[pIndexDepart] = null;
        return pCopyPIECES;
    }

    @Override
    public String toString() {
        super.toString();
        String ret = "";
        for (Coups coups : pListeCoupsLegaux) {
            ret += coups.pPieceDepart.toString() + "(" + Case.valeur(coups.pIndexDepart) + ") :" +
                    Case.valeur(coups.pIndexArrivee) + '\n';

        }
        return ret;
    }
}
